<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<style>
body {
  font-family: Helvetica, arial, sans-serif;
  font-size: 14px;
  line-height: 1.6;
  padding-top: 10px;
  padding-bottom: 10px;
  background-color: white;
  padding: 30px; }

body > *:first-child {
  margin-top: 0 !important; }
body > *:last-child {
  margin-bottom: 0 !important; }

a {
  color: #4183C4; }
a.absent {
  color: #cc0000; }
a.anchor {
  display: block;
  padding-left: 30px;
  margin-left: -30px;
  cursor: pointer;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0; }

h1, h2, h3, h4, h5, h6 {
  margin: 20px 0 10px;
  padding: 0;
  font-weight: bold;
  -webkit-font-smoothing: antialiased;
  cursor: text;
  position: relative; }

h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor {
  background: url() no-repeat 10px center;
  text-decoration: none; }

h1 tt, h1 code {
  font-size: inherit; }

h2 tt, h2 code {
  font-size: inherit; }

h3 tt, h3 code {
  font-size: inherit; }

h4 tt, h4 code {
  font-size: inherit; }

h5 tt, h5 code {
  font-size: inherit; }

h6 tt, h6 code {
  font-size: inherit; }

h1 {
  font-size: 28px;
  color: black; }

h2 {
  font-size: 24px;
  border-bottom: 1px solid #cccccc;
  color: black; }

h3 {
  font-size: 18px; }

h4 {
  font-size: 16px; }

h5 {
  font-size: 14px; }

h6 {
  color: #777777;
  font-size: 14px; }

p, blockquote, ul, ol, dl, li, table, pre {
  margin: 15px 0; }

hr {
  background: transparent url() repeat-x 0 0;
  border: 0 none;
  color: #cccccc;
  height: 4px;
  padding: 0;
}

body > h2:first-child {
  margin-top: 0;
  padding-top: 0; }
body > h1:first-child {
  margin-top: 0;
  padding-top: 0; }
  body > h1:first-child + h2 {
    margin-top: 0;
    padding-top: 0; }
body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child {
  margin-top: 0;
  padding-top: 0; }

a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
  margin-top: 0;
  padding-top: 0; }

h1 p, h2 p, h3 p, h4 p, h5 p, h6 p {
  margin-top: 0; }

li p.first {
  display: inline-block; }
li {
  margin: 0; }
ul, ol {
  padding-left: 30px; }

ul :first-child, ol :first-child {
  margin-top: 0; }

dl {
  padding: 0; }
  dl dt {
    font-size: 14px;
    font-weight: bold;
    font-style: italic;
    padding: 0;
    margin: 15px 0 5px; }
    dl dt:first-child {
      padding: 0; }
    dl dt > :first-child {
      margin-top: 0; }
    dl dt > :last-child {
      margin-bottom: 0; }
  dl dd {
    margin: 0 0 15px;
    padding: 0 15px; }
    dl dd > :first-child {
      margin-top: 0; }
    dl dd > :last-child {
      margin-bottom: 0; }

blockquote {
  border-left: 4px solid #dddddd;
  padding: 0 15px;
  color: #777777; }
  blockquote > :first-child {
    margin-top: 0; }
  blockquote > :last-child {
    margin-bottom: 0; }

table {
  padding: 0;border-collapse: collapse; }
  table tr {
    border-top: 1px solid #cccccc;
    background-color: white;
    margin: 0;
    padding: 0; }
    table tr:nth-child(2n) {
      background-color: #f8f8f8; }
    table tr th {
      font-weight: bold;
      border: 1px solid #cccccc;
      margin: 0;
      padding: 6px 13px; }
    table tr td {
      border: 1px solid #cccccc;
      margin: 0;
      padding: 6px 13px; }
    table tr th :first-child, table tr td :first-child {
      margin-top: 0; }
    table tr th :last-child, table tr td :last-child {
      margin-bottom: 0; }

img {
  max-width: 100%; }

span.frame {
  display: block;
  overflow: hidden; }
  span.frame > span {
    border: 1px solid #dddddd;
    display: block;
    float: left;
    overflow: hidden;
    margin: 13px 0 0;
    padding: 7px;
    width: auto; }
  span.frame span img {
    display: block;
    float: left; }
  span.frame span span {
    clear: both;
    color: #333333;
    display: block;
    padding: 5px 0 0; }
span.align-center {
  display: block;
  overflow: hidden;
  clear: both; }
  span.align-center > span {
    display: block;
    overflow: hidden;
    margin: 13px auto 0;
    text-align: center; }
  span.align-center span img {
    margin: 0 auto;
    text-align: center; }
span.align-right {
  display: block;
  overflow: hidden;
  clear: both; }
  span.align-right > span {
    display: block;
    overflow: hidden;
    margin: 13px 0 0;
    text-align: right; }
  span.align-right span img {
    margin: 0;
    text-align: right; }
span.float-left {
  display: block;
  margin-right: 13px;
  overflow: hidden;
  float: left; }
  span.float-left span {
    margin: 13px 0 0; }
span.float-right {
  display: block;
  margin-left: 13px;
  overflow: hidden;
  float: right; }
  span.float-right > span {
    display: block;
    overflow: hidden;
    margin: 13px auto 0;
    text-align: right; }

code, tt {
  margin: 0 2px;
  padding: 0 5px;
  white-space: nowrap;
  border: 1px solid #eaeaea;
  background-color: #f8f8f8;
  border-radius: 3px; }

pre code {
  margin: 0;
  padding: 0;
  white-space: pre;
  border: none;
  background: transparent; }

.highlight pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px; }

pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px; }
  pre code, pre tt {
    background-color: transparent;
    border: none; }

sup {
    font-size: 0.83em;
    vertical-align: super;
    line-height: 0;
}
* {
	-webkit-print-color-adjust: exact;
}
@media screen and (min-width: 914px) {
    body {
        width: 854px;
        margin:0 auto;
    }
}
@media print {
	table, pre {
		page-break-inside: avoid;
	}
	pre {
		word-wrap: break-word;
	}
}
</style>
<title>视图与响应</title>

</head>
<body>
<h1>视图与响应</h1>

<ul>
<li><a href="#basic-responses">基本响应</a></li>
<li><a href="#redirects">跳转</a></li>
<li><a href="#views">视图</a></li>
<li><a href="#view-composers">视图组件</a></li>
<li><a href="#special-responses">特殊的响应</a></li>
</ul>


<p><a name="basic-responses"></a></p>

<h2>基本响应</h2>

<p><strong>从路由中返回字符串</strong></p>

<pre><code>Route::get('/', function()
{
    return 'Hello World';
});
</code></pre>

<p><strong>创建定制的响应</strong></p>

<p>一个 <code>Response</code> 实例继承自 <code>Symfony\Component\HttpFoundation\Response</code> 类，提供了很多构建 HTTP 响应的函数。</p>

<pre><code>$response = Response::make($contents, $statusCode);

$response-&gt;header('Content-Type', $value);

return $response;
</code></pre>

<p><strong>在响应中添加 Cookie</strong></p>

<pre><code>$cookie = Cookie::make('name', 'value');

return Response::make($content)-&gt;withCookie($cookie);
</code></pre>

<p><a name="redirects"></a></p>

<h2>跳转</h2>

<p><strong>返回一个跳转</strong></p>

<pre><code>return Redirect::to('user/login');
</code></pre>

<p><strong>返回一个带闪存数据的跳转</strong></p>

<pre><code>return Redirect::to('user/login')-&gt;with('message', 'Login Failed');
</code></pre>

<p><strong>返回一个命名路由的跳转</strong></p>

<pre><code>return Redirect::route('login');
</code></pre>

<p><strong>返回一个带参数的命名路由的跳转</strong></p>

<pre><code>return Redirect::route('profile', array(1));
</code></pre>

<p><strong>返回一个带命名参数的命名路由的跳转</strong></p>

<pre><code>return Redirect::route('profile', array('user' =&gt; 1));
</code></pre>

<p><strong>返回一个控制器函数的跳转</strong></p>

<pre><code>return Redirect::action('HomeController@index');
</code></pre>

<p><strong>返回一个带参数的控制器函数的跳转</strong></p>

<pre><code>return Redirect::action('UserController@profile', array(1));
</code></pre>

<p><strong>*返回一个带命名参数的控制器函数的跳转</strong></p>

<pre><code>return Redirect::action('UserController@profile', array('user' =&gt; 1));
</code></pre>

<p><a name="views"></a></p>

<h2>视图</h2>

<p>视图通常包含您应用程序的 HTML 代码以及提供一种便利的方式把控制器从事务逻辑和显示逻辑中分离开来。视图文件存放在 <code>app/views</code> 目录。</p>

<p>一个简单的视图可以像下面这样：</p>

<pre><code>&lt;!-- View stored in app/views/greeting.php --&gt;

&lt;html&gt;
    &lt;body&gt;
        &lt;h1&gt;Hello, &lt;?php echo $name; ?&gt;&lt;/h1&gt;
    &lt;/body&gt;
&lt;/html&gt;
</code></pre>

<p>这个视图可以像这样返回至显示器：</p>

<pre><code>Route::get('/', function()
{
    return View::make('greeting', array('name' =&gt; 'Taylor'));
});
</code></pre>

<p>传给 <code>View::make</code> 的第二个参数是一个数据的数组，用于传递视图中所需要的变量。</p>

<p><strong>传递数据至视图</strong></p>

<pre><code>$view = View::make('greeting', $data);

$view = View::make('greeting')-&gt;with('name', 'Steve');
</code></pre>

<p>在上面的例子中，变量 <code>$name</code> 将在视图中可以访问，并且包含 <code>Steve</code> 值。</p>

<p>您也可以向所有视图共享一个变量的值：</p>

<pre><code>View::share('name', 'Steve');
</code></pre>

<p><strong>传递一个子视图到视图</strong></p>

<p>有些时候，您可能希望传递一个视图到另一个视图。比如，有一个存放在 <code>app/views/child/view.php</code> 的子视图，我们可以像这样转递它至另一个视图：</p>

<pre><code>$view = View::make('greeting')-&gt;nest('child', 'child.view');

$view = View::make('greeting')-&gt;nest('child', 'child.view', $data);
</code></pre>

<p>子视图将在父视图中呈现：</p>

<pre><code>&lt;html&gt;
    &lt;body&gt;
        &lt;h1&gt;Hello!&lt;/h1&gt;
        &lt;?php echo $child; ?&gt;
    &lt;/body&gt;
&lt;/html&gt;
</code></pre>

<p><a name="view-composers"></a></p>

<h2>视图组件</h2>

<p>视图组件是当一个视图建立的时候的回调函数或者类方法。如果您希望在视图建立的时候想绑定数据至一个指定的视图，一个视图组件可以被组织在一个单独的文件，视图组件可以实现 "视图模型" 或 "视图解析" 这样的功能。</p>

<p><strong>定义一个视图组件</strong></p>

<pre><code>View::composer('profile', function($view)
{
    $view-&gt;with('count', User::count());
});
</code></pre>

<p>现在，每次 <code>profile</code> 视图建立的时候，<code>count</code> 数据将被附加到该视图。</p>

<p>您也可以一次性附加一个视图组件到很多视图：</p>

<pre><code>View::composer(array('profile','dashboard'), function($view)
{
    $view-&gt;with('count', User::count());
});
</code></pre>

<p>如果您更希望使用基于类的视图组件，将受益于 <a href="/docs/ioc">IoC 容器</a>，您可以这样做：</p>

<pre><code>View::composer('profile', 'ProfileComposer');
</code></pre>

<p>一个视图组件类可以像下面这样定义：</p>

<pre><code>class ProfileComposer {

    public function compose($view)
    {
        $view-&gt;with('count', User::count());
    }

}
</code></pre>

<p>注意没有惯例指明组件类的存放位置。您可以在任何地方存放它们，只要它们能够在 <code>composer.json</code> 中使用自动加载功能加载它们。</p>

<p><a name="special-responses"></a></p>

<h2>特殊的响应</h2>

<p><strong>创建一个 JSON 响应</strong></p>

<pre><code>return Response::json(array('name' =&gt; 'Steve', 'state' =&gt; 'CA'));
</code></pre>

<p><strong>创建一个 JSONP 响应</strong></p>

<pre><code>return Response::json(array('name' =&gt; 'Steve', 'state' =&gt; 'CA'))-&gt;setCallback(Input::get('callback'));
</code></pre>

<p><strong>创建一个文件下载的响应</strong></p>

<pre><code>return Response::download($pathToFile);

return Response::download($pathToFile, $name, $headers);
</code></pre>
</body>
</html>